#include <iostream>
#include<fstream>
#include <string>
using namespace std;
/*
 * 因为没有实现拷贝构造函数，系统自己调用的拷贝函数为浅拷贝导致析构函数会执行两次，从而使函数报错。因此此处没有写析构函数。
 */
class mystack{
private:
    struct Node{
        char data;
        Node *next;
    };
    Node *m_sp;
public:
    mystack(){
        m_sp= nullptr;
    }
    void push(char x)
    {
        Node* p=new Node;
        p->data=x;
        p->next=m_sp;
        m_sp=p;
    }
    bool empty()
    {
        return (m_sp== nullptr);
    }
    char top()
    {
        return m_sp->data;
    }
    void pop()
    {
        Node* p=m_sp;
        m_sp=m_sp->next;
        delete p;
    }
};
class myqueue{
private:
    struct Node {
        char data;
        Node *next;
    };
    Node* head;
    Node* tail;
public:
    myqueue(){
        head= nullptr;
        tail=head;
    }
    void push(char x)
    {
        Node* p=new Node;
        p->data=x;
        p->next= nullptr;
        if(head== nullptr)
        {
            tail=p;
            head=p;
        }
        else
        {
            tail->next=p;
            tail=p;
        }
    }
    char top()
    {
        return head->data;
    };
    void pop()
    {
        Node* p=head;
        if(head==tail)
        {
            head= nullptr;
            tail= nullptr;
        }
        else
        {
            head=head->next;
            delete p;
        }
    }
    bool empty()
    {
        return (head== nullptr);
    }
};
/*
 *将输入的字符串压入栈中
 */
mystack creatstack()
{
    string input;
    cin>>input;
    mystack p;
    for(int i=input.size()-1;i>=0;i--)
    {
        p.push(input[i]);
    }
    return p;
}
/*
 * 对括号内容进行分析第一次是采用字符串进行返回，但是如果括号里面有A或B导致并不识别。
 * 第二次返回栈，从而使括号里面的内容也能正常返回
 */
mystack ansys(myqueue p,mystack q)
{
    string num;
    string mee="";
    while(!p.empty())
    {
        num+=p.top();
        p.pop();
    }
    char a=num[0];
    mystack c;
    for(int i=1;i<num.size();i++)
    {
        c.push(num[i]);
    }
    while(!c.empty())
    {
        mee+=a;
        mee+=c.top();
        c.pop();
    }
    mee+=a;
   for(int i=mee.size()-1;i>=0;i--)
        q.push(mee[i]);
    return q;
}
/*
 * 可以自定义A、B的内容，增加文法的多样性
 */
mystack pAush(mystack p)
{
    string b="sae";
    for(int i=b.size()-1;i>=0;i--)
        p.push(b[i]);
    return p;
}
mystack pBush(mystack p)
{
    string b="tAdA";
    for(int i=b.size()-1;i>=0;i--)
        p.push(b[i]);
    return p;
}
int main()
{
    string total="";
    mystack q=creatstack();
    myqueue p;
    while(!q.empty())
    {
        char m=q.top();
        q.pop();
        if(m=='A')
        {
            //total+="sae";
            q=pAush(q);
        }
        else if(m=='B')
        {
            //total+="tsaedsae";
            q=pBush(q);
        }
        else if(m=='(')
        {
            while(true)
            {
                m=q.top();
                q.pop();
                if(m==')')
                    break;
                p.push(m);
            }
            q=ansys(p,q);
        }
        else total+=m;
    }
    ofstream os;
    os.open("reuslt.txt",ios::out);
    os<<total;
    os.close();
    return 0;
}